#include "surface.hpp"

std::vector<Sommet> Surface::getSommets()
{
	return sommets;
}

std::vector<Face> Surface::getFaces()
{
	return faces;
}

void Surface::ajoutSommet(Sommet s)
{
	sommets.push_back(s);
}

void Surface::ajoutFace(Face f)
{
	faces.push_back(f);
}

void Surface::chargementOFF(std::string nomFichier)
{
	std::fstream fichier(nomFichier.c_str());
	if(!fichier)
	{
		std::cout<<"erreur de lecture du fichier"<<std::endl;
	}
	else
	{
		//tableau contenant pour chaque sommet un tableau d'indice de ces faces adjacentes dans faces
		std::vector<std::vector<int> > init;
		int nombreSommet;
		int nombreFace;
		std::string ligne;
		getline(fichier,ligne);
		fichier>>nombreSommet;
		fichier>>nombreFace;
		getline(fichier,ligne);
		
		//récupération des sommets
		for(int i=0;i<nombreSommet;i++)
		{
			double x,y,z;
			fichier>>x;
			fichier>>y;
			fichier>>z;
			getline(fichier,ligne);
			sommets.push_back(Sommet(i,x,y,z));
			//on ajoute un tableau d'indice par sommet
			init.push_back(std::vector<int>());
		}
		
		//récupération des faces
		for(int i=0;i<nombreFace;i++)
		{
			int nbS;
			fichier>>nbS;
			int s1,s2,s3;
			fichier>>s1;
			fichier>>s2;
			fichier>>s3;
			getline(fichier,ligne);
			faces.push_back(Face(&(sommets.at(s1)),&(sommets.at(s2)),&(sommets.at(s3))));

			//on ajoute les indices des faces au tableau des sommets
			init.at(s1).push_back(faces.size()-1);
			init.at(s2).push_back(faces.size()-1);
			init.at(s3).push_back(faces.size()-1);
		}
		
		//initialise les faces adjacentes
		for(int i=0;i<nombreFace;i++)
		{
			//on récupére les indices des sommets de la faces
			int s1=faces.at(i).getSommet(0)->getId();
			int s2=faces.at(i).getSommet(1)->getId();
			int s3=faces.at(i).getSommet(2)->getId();
			
			//on initialise le pointeurs de face des trois sommets de la face
			sommets.at(s1).setFace(&(faces.at(i)));
			sommets.at(s2).setFace(&(faces.at(i)));
			sommets.at(s3).setFace(&(faces.at(i)));
			
			//on cherche la face commune a s2 et S3 et différente de la face courante
			for(unsigned int j=0;j<init.at(s2).size();j++)
			{
				for(unsigned int k=0;k<init.at(s3).size();k++)
				{
					if(faces.at(init.at(s2).at(j))==faces.at(init.at(s3).at(k)) && init.at(s2).at(j)!=i)
					{
						faces.at(i).setFace(&(faces.at(init.at(s2).at(j))),0);
					}
				}
			}
			//on cherche la face commune a s1 et S3 et différente de la face courante
			for(unsigned int j=0;j<init.at(s3).size();j++)
			{
				for(unsigned int k=0;k<init.at(s1).size();k++)
				{
					if(faces.at(init.at(s3).at(j))==faces.at(init.at(s1).at(k)) && init.at(s3).at(j)!=i)
					{
						faces.at(i).setFace(&(faces.at(init.at(s3).at(j))),1);
					}
				}
			}
			//on cherche la face commune a s2 et S1 et différente de la face courante
			for(unsigned int j=0;j<init.at(s1).size();j++)
			{
				for(unsigned int k=0;k<init.at(s2).size();k++)
				{
					if(faces.at(init.at(s1).at(j))==faces.at(init.at(s2).at(k)) && init.at(s1).at(j)!=i)
					{
						faces.at(i).setFace(&(faces.at(init.at(s1).at(j))),2);
					}
				}
			}
		}
		
	}
	fichier.close();
}

void Surface::ecritureOFF(std::string nomFichier)
{
	std::ofstream fichier(nomFichier.c_str());
	fichier<<"OFF"<<std::endl;
	fichier<<sommets.size()<<" "<<faces.size()<<" 0"<<std::endl;
	std::vector<Sommet>::iterator itSommet;
	
	//ajout des sommets
	for(itSommet=sommets.begin();itSommet!=sommets.end();itSommet++)
	{
		fichier<<*itSommet<<std::endl;
	}
	
	//ajout des faces
	std::vector<Face>::iterator itFace;
	for(itFace=faces.begin();itFace!=faces.end();itFace++)
	{
		fichier<<*itFace<<std::endl;
	}
	
	fichier.close();
}






